package iface.aplicativo.negocio.entidade;

import iface.aplicativo.negocio.enumerador.TipoLancamentoEnum;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.entidade.Entidade;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "conta")
@SequenceGenerator(name = "sq_conta", sequenceName = "sq_conta", allocationSize = 1, initialValue = 1)
public class Conta implements Entidade {

	private static final long serialVersionUID = 2373586767063323982L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_conta")
	@Column(name = "id_conta")
	private Long id;
	@Column(name = "nm_banco")
	private String nmBanco;
	@Column(name = "nr_agencia")
	private String nrAgencia;
	@Column(name = "nr_conta")
	private String nrConta;
	@Column(name = "nm_gerente")
	private String nmGerente;
	@Column(name = "telefone")
	private String telefone;

	@OneToMany(mappedBy = "conta")
	private List<Lancamento> lancamentos;

	@Transient
	private String contaCompleto;

	@Transient
	private Double saldo;

	@Transient
	private Double saldoAtualizado;

	public Serializable getIdentificador() {
		return getId();
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNmBanco() {
		return nmBanco;
	}

	public void setNmBanco(String nmBanco) {
		this.nmBanco = nmBanco;
	}

	public String getNrAgencia() {
		return nrAgencia;
	}

	public void setNrAgencia(String nrAgencia) {
		this.nrAgencia = nrAgencia;
	}

	public String getNrConta() {
		return nrConta;
	}

	public void setNrConta(String nrConta) {
		this.nrConta = nrConta;
	}

	public String getNmGerente() {
		return nmGerente;
	}

	public void setNmGerente(String nmGerente) {
		this.nmGerente = nmGerente;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getContaCompleto() {
		if (!UtilString.isVazio(nmBanco) && !UtilString.isVazio(nrAgencia)
				&& !UtilString.isVazio(nrConta)) {
			contaCompleto = nmBanco + " :: " + nrAgencia + " :: " + nrConta;
		}
		return contaCompleto;
	}

	public void setContaCompleto(String contaCompleto) {
		this.contaCompleto = contaCompleto;
	}

	public List<Lancamento> getLancamentos() {
		return lancamentos;
	}

	public void setLancamentos(List<Lancamento> lancamentos) {
		this.lancamentos = lancamentos;
	}

	public Double getSaldo() {
		saldo = 0.0;
		if (this.getLancamentos() != null && !this.getLancamentos().isEmpty()) {
			for (Lancamento lancamento : this.getLancamentos()) {
				if (lancamento.getDtBaixa() != null) {
					if (lancamento.getTipo().equals(TipoLancamentoEnum.R)) {
						saldo += lancamento.getValorTotal();
					} else if (lancamento.getTipo()
							.equals(TipoLancamentoEnum.P)) {
						saldo -= lancamento.getValorTotal();
					}
				}
			}
		}
		saldoAtualizado = saldo;
		return saldo;
	}

	public void setSaldo(Double saldo) {
		this.saldo = saldo;
	}

	public Double getSaldoAtualizado() {
		return saldoAtualizado;
	}

	public void setSaldoAtualizado(Double saldoAtualizado) {
		this.saldoAtualizado = saldoAtualizado;
	}

}
